package com.gem.day13;

import java.io.*;

import org.apache.commons.io.FileUtils;

/**
 * IO综合实战案例:
 * 文件拷贝
 */
public class FileCopyDemo {

	public static void main(String[] args) {
		FileCopyDemo demo = new FileCopyDemo();
		//demo.copyFile("D:\\软件\\VMware-workstation-full-15.5.1-15018445.exe", "E:\\vm.exe");

		demo.copyFolder("D:\\java\\demo", "E:\\demo");
	}

	/**
	 * 文件拷贝功能
	 * @param src				源文件,要拷贝的文件
	 * @param target		目标文件位置
	 */
	public void copyFile(String src, String target) {
		//根据源头和目标选择合适IO对象

		//方式一: 每次读取一个字节,写入一个字节,效率极低
		/*try (InputStream is = new FileInputStream(src); OutputStream os = new FileOutputStream(target)) {
			int len = -1;
			while ((len = is.read()) != -1) {
				os.write(len);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}*/

		//方式二: 使用缓存一次读取整个缓存大小,写入整个缓存大小,从而提高读写性能
		try (BufferedInputStream is = new BufferedInputStream(new FileInputStream(src));
				BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(target))) {
			//设置缓存大小
			byte[] buf = new byte[5 * 1024];//5K
			int len = -1;
			//读取一个缓存大小
			while ((len = is.read(buf)) != -1) {
				os.write(buf, 0, len);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 拷贝文件夹
	 */
	public void copyFolder(String src, String target) {

		//方式一: 自己实现
		/*File srcFile = new File(src);
		File targetFile = new File(target);
		if (!targetFile.exists()) {
			targetFile.mkdirs();
		}
		for (File f : srcFile.listFiles()) {
			if (f.isFile()) {
				copyFile(f.getAbsolutePath(), target + File.separator + f.getName());
			} else {
				copyFolder(f.getAbsolutePath(), target + File.separator + f.getName());
			}
		}*/

		//方式二: 使用commons-io组件
		try {
			FileUtils.copyDirectory(new File(src), new File(target));
		} catch (Exception e) {
			e.printStackTrace();
		}

		//方式三: 使用hutool组件
		//FileUtil.copyFilesFromDir(new File(src), new File(target), true);
	}
}
